﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Common.DataAccess;
using CBE.Model;

namespace CBE.DataAccess
{
    public class AdministrarProveedoresDataAccess : GenericEntityManagerDataAccess<Proveedores, AdministrarProveedoresCriteria, AdministrarProveedoresView, CBEEntities>
    {
        protected override Proveedores ReadEntity(Guid id)
        {
            return ObjectContext.Proveedores.
                Include("Localidades").
                Include("Provincias").
                Include("TiposDocumentos").
                Where(proveedor => proveedor.ID_Proveedor == id).
                FirstOrDefault();
        }

        public override List<AdministrarProveedoresView> Read(AdministrarProveedoresCriteria criteria)
        {
            return ObjectContext.Proveedores.
                Where(proveedor => (String.IsNullOrEmpty(criteria.RazonSocial) || proveedor.RazonSocial.Contains(criteria.RazonSocial)) &&
                                   (String.IsNullOrEmpty(criteria.CuitCuil) || proveedor.NumeroDocumento.Contains(criteria.CuitCuil))).
                Select(proveedor => new AdministrarProveedoresView
                {
                    ID = proveedor.ID_Proveedor,
                    Codigo = proveedor.Codigo,
                    CuitCuil = proveedor.NumeroDocumento,
                    Direccion = proveedor.Calle + " " + proveedor.Numero,
                    NombreContacto = proveedor.NombreContacto,
                    RazonSocial = proveedor.RazonSocial
                }).OrderBy(prov => prov.Codigo).ToList();
        }

        public override void Save(Proveedores entity)
        {
            this.ValidateCodigoUnico(entity);
            base.Save(entity);
        }

        private void ValidateCodigoUnico(Proveedores entity)
        {
            if (ObjectContext.Proveedores.Any(pr => pr.Codigo.ToUpper() == entity.Codigo.ToUpper() && pr.ID_Proveedor != entity.ID_Proveedor))
            {
                throw new Exception("Ya existe un proveedor con el código ingresado.");
            }
        }
    }
}
